﻿using System;
using Itau.IM.Interpolador.Contract;
using Itau.IM.Interpolador.Interface;
using Itau.IM.Common.Interface;
using Itau.IM.Common.Logging;
using Itau.IM.Common.Mainframe.Communication;
using Itau.IM.Common.Utility;
using Itau.IM.Common.Mainframe.Book;
using Itau.IM.Common.Mainframe.Constants;

namespace Itau.IM.Interpolador.Implementation
{
    public class InterpoladorImpl : IInterpolador
    {
        private DateTime TratarHorarioNulo(DateTime dataHora_)
        {
            if (dataHora_.Hour == 0 && dataHora_.Minute == 0 && dataHora_.Second == 0)
            {
                return new DateTime(dataHora_.Year, dataHora_.Month, dataHora_.Day, 23, 59, 59);
            }

            return dataHora_;
        }

        public ConsultarCurvaResponse ConsultarCurva(ConsultarCurvaRequest request_)
        {
            string nomeRotina = "TransferPrice";
            ConsultarCurvaResponse resultado = new ConsultarCurvaResponse();
            resultado.Pontos = new System.Collections.Generic.List<PontoCurvaEO>();

            try
            {
                request_.NomeCurva = request_.NomeCurva.ToUpper();
                ConsultarCurvaResponse retorno = null;

                do
                {
                    if (retorno != null)
                    {
                        request_.DataVencimento = retorno.DataVencimentoProxima;
                    }

                    string bookEntrada = BookSerializer.Serialize(request_);

                    string mock = Configuration.GetSetting("Mock.ConsultarRegularSemPrazo");

                    string bookSaida = (mock != null) ? mock : new ImsTransaction(nomeRotina, ConfigurationConstants.BOOK_SEGMENTADO).Invoke(bookEntrada);

                    retorno = (ConsultarCurvaResponse)BookSerializer.Deserialize(bookSaida, typeof(ConsultarCurvaResponse));

                    resultado.CodigoRetorno = retorno.CodigoRetorno;
                    resultado.Erro = retorno.Erro;
                    resultado.Mensagem = retorno.Mensagem;
                    resultado.POS = retorno.POS;
                    resultado.Quantidade += retorno.Quantidade;

                    resultado.Pontos.AddRange(retorno.Pontos);
                } while (!string.IsNullOrEmpty(retorno.DataVencimentoProxima));
            }
            catch (Exception e)
            {
                throw new Exception("Erro durante a execução do método 'ConsultarCurvas': " + e.Message, e);
            }

            return resultado;

        }

    }
}